package zy.blue7.gui.netty.package1.lengthfieldbasedframedecoder;

import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.CharsetUtil;

/**
 * @Author: blue7
 * @Date: 2022/2/25 19:57
 * @Version 1.0
 * @Description https://blog.csdn.net/mffandxx/article/details/51923651
 */
public class TimeServerHandler extends SimpleChannelInboundHandler<Object> {
    static int count = 0;

    @Override
    protected void channelRead0(ChannelHandlerContext channelHandlerContext, Object msg) throws Exception {

        /**
         * 到这里，由于这个处理器前面是 string 处理器，会吧 bytebuf 转换成 string， 所以直接 可以强制转换成 string
         * todo 如何使用 其他类型（User， integer等等）进行接收就会出现错误或者  消息不被处理
         */
        String buf = (String) msg;

        System.out.println(buf + " --- ");

        /**
         * 这里必须把字符串 变成 bytebuf， 因为netty 中 传递的类型就是 bytebuf 类型， 然后又没有 设置 todo ChannelOutboundHandler，即将我 出站的处理器，那么出站的 数据就只能是 bytebuf
         * todo 如果 我设置了  StringEncoder ,将字符串变成 Bytebuf， 那么我出站的 最开始的数据就可以是字符串了
         */
        channelHandlerContext.writeAndFlush(Unpooled.copiedBuffer("this is a message " + count++ +"*", CharsetUtil.UTF_8));
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        ctx.flush();
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
    }
}
